bitkeeper revision 1.1236.57.2 (4252646a-w2lxhow-zRG4FwNSoDk5A)
authorvh249@arcadians.cl.cam.ac.uk <vh249@arcadians.cl.cam.ac.uk>
Tue, 5 Apr 2005 10:11:54 +0000 (10:11 +0000)
committervh249@arcadians.cl.cam.ac.uk <vh249@arcadians.cl.cam.ac.uk>
Tue, 5 Apr 2005 10:11:54 +0000 (10:11 +0000)
add support for memory suffix in user tools and in kernel

Signed-off-by: Vincent Hanquez <vincent@xensource.com>
tools/python/xen/xm/main.py
xen/arch/x86/domain_build.c
xen/common/kernel.c
xen/include/xen/init.h

index 43e12e3892970630ded58d16c0db77a5703e3e1c..6fe3535ff3c9fcedd07acc069d2297e5d4790577 100644 (file)
@@ -14,6 +14,31 @@ from xen.xend.XendClient import main as xend_client_main
 from xen.xm import create, destroy, migrate, shutdown, sysrq
 from xen.xm.opts import *
 
+def unit(c):
+    if not c.isalpha():
+        return 0
+    base = 1
+    if c == 'G' or c == 'g': base = 1024 * 1024 * 1024
+    elif c == 'M' or c == 'm': base = 1024 * 1024
+    elif c == 'K' or c == 'k': base = 1024
+    else:
+        print 'ignoring unknown unit'
+    return base
+
+def int_unit(str, dest):
+    base = unit(str[-1])
+    if not base:
+        return int(str)
+
+    value = int(str[:-1])
+    dst_base = unit(dest)
+    if dst_base == 0:
+        dst_base = 1
+    if dst_base > base:
+        return value / (dst_base / base)
+    else:
+        return value * (base / dst_base)
+
 class Group:
 
     name = ""
@@ -475,7 +500,7 @@ class ProgMaxmem(Prog):
     def main(self, args):
         if len(args) != 3: self.err("%s: Invalid argument(s)" % args[0])
         dom = args[1]
-        mem = int(args[2])
+        mem = int_unit(args[2], 'm')
         server.xend_domain_maxmem_set(dom, mem)
 
 xm.prog(ProgMaxmem)
@@ -493,7 +518,7 @@ MEMORY_TARGET megabytes"""
     def main(self, args):
         if len(args) != 3: self.err("%s: Invalid argument(s)" % args[0])
         dom = args[1]
-        mem_target = int(args[2])
+        mem_target = int_unit(args[2], 'm')
         server.xend_domain_mem_target_set(dom, mem_target)
 
 xm.prog(ProgBalloon)
index b7c8156dfd8aac79f77785e7dc17c29d6921479e..ff199626069d5be347627dd8fe75483f2f2a6a37 100644 (file)
@@ -23,7 +23,7 @@
 
 /* opt_dom0_mem: Kilobytes of memory allocated to domain 0. */
 static unsigned int opt_dom0_mem = 0;
-integer_param("dom0_mem", opt_dom0_mem);
+integer_unit_param("dom0_mem", opt_dom0_mem);
 
 #if defined(__i386__)
 /* No ring-3 access in initial leaf page tables. */
index e27a10a76b3130a85ab8a46d52974b6b529b6a59..33122e93330e4623a63f398528cf2b5d8fec2ad6 100644 (file)
@@ -55,6 +55,24 @@ void cmdline_parse(char *cmdline)
                     *(unsigned int *)param->var =
                         simple_strtol(opt, (char **)&opt, 0);
                 break;
+            case OPT_UINT_UNIT:
+                if ( opt != NULL )
+                {
+                    int base = 1;
+                    unsigned int value;
+
+                    value = simple_strtoul(opt, (char **)&opt, 0);
+                    if (*opt == 'G' || *opt == 'g') {
+                        base = 1024 * 1024;
+                        opt++;
+                    } if (*opt == 'M' || *opt == 'm') {
+                        base = 1024;
+                        opt++;
+                    } else if (*opt == 'K' || *opt == 'k')
+                        opt++;
+                    *(unsigned int *) param->var = value * base;
+                }
+                break;
             case OPT_BOOL:
                 *(int *)param->var = 1;
                 break;
index 6df189f9804d54158eebc288b3781810804db302..991abc6c24f1c1f3b4d429603a691fd2e70f8e86 100644 (file)
@@ -59,7 +59,7 @@ extern initcall_t __initcall_start, __initcall_end;
  */
 struct kernel_param {
     const char *name;
-    enum { OPT_STR, OPT_UINT, OPT_BOOL } type;
+    enum { OPT_STR, OPT_UINT, OPT_UINT_UNIT, OPT_BOOL } type;
     void *var;
     unsigned int len;
 };
@@ -74,6 +74,10 @@ extern struct kernel_param __setup_start, __setup_end;
     static char __setup_str_##_var[] __initdata = _name; \
     static struct kernel_param __setup_##_var __attribute_used__ \
         __initsetup = { __setup_str_##_var, OPT_UINT, &_var, sizeof(_var) }
+#define integer_unit_param(_name, _var) \
+    static char __setup_str_##_var[] __initdata = _name; \
+    static struct kernel_param __setup_##_var __attribute_used__ \
+        __initsetup = { __setup_str_##_var, OPT_UINT_UNIT, &_var, sizeof(_var) }
 #define string_param(_name, _var) \
     static char __setup_str_##_var[] __initdata = _name; \
     static struct kernel_param __setup_##_var __attribute_used__ \